<?

/**
 * Templates class
 *
 * Esta clase maneja los templates para mandar por mail
 * @author Alejandro Garcia del Rio <alejandro.garciadelrio@gmail.com>
 * @version 1.0
 * @package Eventos
*/
class Templates extends Core {

	static protected $instancia;
	static protected $opciones = array(
		'filtros' => array(
		),
	);
	private $id_tipo = null;
	private $template_dir = 'templates/';

	/**
	 * Constructor de la clase.
	 * 
	 * @param integer $id_tipo (opcional) El id del tipo de evento que se quiere instanciar
	 * @param array $opciones (opcional) Opciones validas para esta clase
	 */
	function __construct ($id_tipo=null, $opciones=null) {
		// Llamo al constructor del parent tambien
		parent::__construct();
		// Guardo las opciones si me definio alguna
		if ($opciones)
			$this->opciones($opciones);
		// Hago absoluto el path de los templates
		$this->template_dir = CONFIG_DOCUMENT_ROOT.$this->template_dir;
		$this->template_url = CONFIG_SITE_URL.$this->template_dir;
	}

	/**
	 * Devuelve una unica instancia de esta clase
	 * 
	 * @return object Instancia de esta clase
	 */
	public static function getInstance() {
		if (!self::$instancia instanceof self)
			self::$instancia = new self;
		return self::$instancia;
	}

	/**
	 * Setea las opciones 
	 * 
	 * @param array $opciones (opcional) Opciones validas para esta clase. Si esta vacio, funciona como un getter.
	 * @return array $opciones Listado de opciones
	 */
	public function opciones ($opciones=null) {
		return self::$opciones = parent::opciones(self::$opciones, $opciones);
	}

	/**
	 * Devuelve el contenido de un template para enviar por mail
	 * 
	 * @param integer $id El id del template
	 * @param array $reemplazos (Opcional) Array de reemplazos a aplicar en el template
	 * @return array El contenido html del template generado y su asunto
	 */
	public function get ($id=null, $reemplazos=null) {

		// Saneamiento de variables
		$id = addslashes($id);
		
		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo el registro del template
		$template = $db->get_row("SELECT * FROM evn_templates WHERE id = '$id'");

		// Obtengo el contenido del template
		if (!($template['template'] = file_get_contents($this->template_dir.$id.'.tpl.php')))
			return $this->fail('No se encontro el contenido del template solicitado');

		// Aplico los reemplazos
		if ($reemplazos)
			$this->replace($template['template'], $reemplazos);

		return $template;
	}

	/**
	 * Ejecuta el reemplazo para un template
	 * 
	 * @param array $template El template (array con formato array('asunto' => , 'tpl' => ))
	 * @param array $reemplazos Array de reemplazos a aplicar en el template
	 * @return array El contenido html del template generado y su asunto
	 */
	public function replace ($template, $reemplazos) {

		foreach (array('asunto', 'tpl') as $var)
			foreach ($reemplazos as $k => $v)
				$template[$var] = preg_replace('/\[\['.$k.'\]\]/is', $v, $template[$var]);

		return $template;
	}

	/**
	 * Guarda los cambios a un template
	 * 
	 * @param array $campos Los campos a almacenar. Si recibe id, modifica sino agrega
	 * @return integer El id de registro insertado o actualizado
	 */
	public function save ($campos) {

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Me fijo si tengo que actualizarlo o insertarlo
		$id = $campos['id'];
		if ($id)
			$db->update('evn_templates', $campos);
		else
			$id = $db->insert('evn_templates', $campos);

		// Almaceno el contenido fisico del template
		file_put_contents($this->template_dir.$id.'.tpl.php', $campos['template']);

		return $id;
	}


	/**
	 * Elimina un template existente
	 * 
	 * @param integer $id El id del template a eliminar
	 * @return boolean
	 */
	public function eliminar ($id) {

		// Saneamiento de variables 
		$id = addslashes($id);

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Fuerzo el id por el que me paso como parametro
		$template['id'] = $id;

		// Elimino el template de la base de datos
		$db->query("DELETE FROM evn_templates WHERE id = '$id'");
		
		// Elimino el contenido fisico del template
		unlink($this->template_dir.$id.'.tpl.php');
		
		return true;
	}

	/**
	 * Devuelve el listado de templates existentes
	 * 
	 * @param array $opciones (opcional) Opciones validas para esta clase
	 * @return array
	 */
	public function listar ($opciones=null) {

		// Seteo/obtengo las opciones
		$opciones = self::opciones($opciones);

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Armo los filtros
		$and = '';
		if ($opciones['filtros'])
			$and = 'AND '.implode(' AND ', $opciones['filtros']);

		// Obtengo los templates
		$templates = array();
		if ($_templates = $db->get_results("SELECT * FROM evn_templates et WHERE 1=1 $and"))
			foreach ($_templates as $template)
				$templates[$template['id']] = $template;

		return $templates;
	}

	/**
	 * Devuelve la url publica del template
	 * 
	 * @param integer $id El id del template
	 * @return string
	 */
	public function url ($id) {

		// Saneamiento de variables 
		$id = addslashes($id);
		
		return $this->template_url.$id.'.tpl.php';
	}
	
}

?>
